
#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N = 2e5;
#define INF 0x7fffffff
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//
//一定存在
ll a[N + 10];
//int b[N+10];//存到m的前缀和
//int c[N+10];//前m个中到某个位置的最大的数,m个位置后的最小值
void solve()
{
	int n, m;
	sd(n); sd(m);
	// multiset<int> m_h;
	// //int t=-INF;
	// for(int i=1;i<=m;i++)
	// {
	// 	sd(a[i]);
	// 	//c[i]=max(a[i],t);
	// 	m_h.insert(m_h);
	// }
	// //t=INF;
	// multiset<int> m_l;
	// for(int i=m+1;i<=n;i++)
	// {
	// 	sd(a[i]);
	// 	//c[i]=min(a[i],t);
	// 	m_h
	// }

	// int div=0;
	// for(int i=1;i<m;i++) b[i]=b[i-1]+a[i];

	// for(int i=1;i<=m;i++)


	for (int i = 1; i <= n; i++) sld(a[i]);
	if (n == 1)
	{
		puts("0");
		return;
	}

	int ans = 0;
	if (m != 1 && a[m] > 0)//判断a[m]
	{
		a[m] = -a[m];
		ans++;
	}

	ll cur = a[m];
	multiset<ll, greater<ll>> cnt;
	for (int i = m - 1; i > 1; i--)//从a[m-1]往前加和大于0删这段最大
	{
		cur += a[i];
		if (a[i] > 0)
		{
			cnt.insert(a[i]);
			while (cur > 0)
			{
				ll tmp = *cnt.begin();//找最大,删除
				cur -= tmp * 2;
				cnt.erase(cnt.lower_bound(tmp));//二分快
				ans++;
			}
		}
	}
	cur = 0;
	multiset<ll> cnt2;
	for (int i = m + 1; i <= n; i++)//从a[m+1]往后加和小于0,删这段最小
	{
		cur += a[i];
		if (a[i] < 0)
		{
			cnt2.insert(a[i]);
			while (cur < 0)
			{
				ll tmp = *cnt2.begin();//找最小删除
				cur -= tmp * 2;
				cnt2.erase(cnt2.lower_bound(tmp));
				ans++;
			}
		}
	}
	pd(ans);
	puts("");
}

int main()
{
	int T;
	sd(T);
	while (T--)
	{
		solve();
	}
	return 0;
}